

# 首先要知道，QT当中封装了很多关于数据库操作的组件（方法、函数、类）
# 也就是他非常方便地实现了界面与数据库中地数据传输


# 导入需要的包
from os.path import exists         # 用来判断数据库是否存在
from PyQt5.QtWidgets import *      # 导入pyqt5的相关组件
from PyQt5.QtCore import *         # 使用QtCore当中关于（封装好的）数据库的组件
from PyQt5.QtSql import *          # 导入pyqt5当中的数据库
import sys                         # 导入系统所需要的参数


# 第一步：判断数据库是否存在
if not exists('student.db'):
    print('数据库文件不存在')
    sys.exit()      # 当数据文件不存在时，直接退出系统。

# 第二步（当数据库存在时候）：制作界面以及数据绑定
app = QApplication([])       # QApplication（）当中的[] 表示，参数为空 （注意：这里一定要给给明参数）
# 连接数据库（实现组件与数据库绑定） 实现组件与数据库的绑定，需要借助qt当中的model
#       说明：qt当中提供的model是一个模型，其实相当于是数据和界面组件之间的一个桥梁纽带
#       数据（数据库）---（model）---组件（界面）
#   1.指定数据库的类型(数据库有多种类型，而不同数据库的写法有些许差异，所以需要指定具体的哪种)
db = QSqlDatabase.addDatabase("QSQLITE")   # 注意：这里就是全大写
#   2.指定哪个数据库(想要连接数据库（SQLite）中的哪个具体数据库)
db.setDatabaseName('student.db')
db.open()  # 打开数据库
# 数据与组件的连接需要model
model = QSqlTableModel(None, db)   # 我基于这样的db构建这样的model
# 有了model之后就要说明用model连接的是哪个表
model.setTable('student')

# 这里需要对model进行一定的设置（设置其修改策略）这样就可以实现界面的数据操作直接连接对应的数据库中的对象
model.setEditStrategy(QSqlTableModel.OnFieldChange)  # Filed:单元格（内容修改）
# 当然注意：如果是做项目，这里在修改之前需要做提示的弹窗效果！！！！


# 得到表之后，我们需要里面的所有数据
model.select()         # 实现了将（student表当中）的所有数据都放在model当中
# 为了实现view界面的可读话（字段名的更改title等装饰优化）
model.setHeaderData(0, Qt.Horizontal, '名字')     # 更改表头 第零列（0）、水平（Qt.Horizontal）、更改后的表头名（'名字'）
model.setHeaderData(1, Qt.Horizontal, '电话')
model.setHeaderData(2, Qt.Horizontal, '地址')
# 数据端的工作结束之后，需要处理界面方面的事情
# 先创建一个view
view = QTableView()   # 也就是创建一个表格显示的界面
# 下面就将之前的model添加到view当中去
view.setModel(model)  # 实现了数据与ui界面的绑定

# 下面我们想要实现在界面内添加数据，那么我们添加两个按钮
# 首先我们制作一个弹窗界面
dialog = QDialog()     # 创建一个对话框对象（对话框内需要放置view数据表格，添加按钮，删除按钮）
dialog.setWindowTitle('sqlite操作')
# 有了多个组件就需要进行布局
layout = QVBoxLayout()  # 创建一个垂直布局对象
layout.addWidget(view)  # 将之前的view组件添加进布局


# 定义添加按钮的触发事件
def add_row():
    print(model.rowCount())
    num = model.insertRows(model.rowCount(), 1)     # 注意添加的是多行insertRows 后面一定要加s！！！
    print(num)   # 注意：这里的界面操作的数据可以直接保存到数据库当中！！！


btn_add = QPushButton('添加')     # 创建添加按钮
# 实现按键的点击事件的触发 需要设置 按键的点击触发信号和槽的连接设置
btn_add.clicked.connect(add_row)  # add_row是添加按钮的触发事件
layout.addWidget(btn_add)        # 将添加按钮添加到布局当中


btn_delete = QPushButton('删除')  # 创建删除按钮
btn_delete.clicked.connect(lambda: model.removeRow(view.currentIndex().row()))
# 删除按钮的点击信号和对应槽的连接  这里我们是编写了一个lambda函数来实现的
# 格式：lambda： model.removeRow(view.currentIndex().row())
# 含义：将model当中的当前view的索引（view.currentIndex()）对应的行（.row()）删除（.removeRow）
layout.addWidget(btn_delete)     # 将删除按钮添加到布局当中

dialog.setLayout(layout)         # 将设置好的布局添加到dialog

# 显示窗体
dialog.show()

# 让程序循环运行
app.exec_()


